﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace puerto_serie
{
    public class InteligenciaCpu
    {
        private int TAMANOMAXIMO = 8;
        private int techo = 4;
        private int resultadoEjecucion = 0;
        public InteligenciaCpu()
        {
            golpeoEnTurnoAnterior = false;
            golpeoEnTurnoActual = false;
            falloArriba = false;
            falloAbajo = false;
            falloDerecha = false;
            falloIzquierda = false;
            cantidadDeAciertos = 1;
            resultadoEjecucion = 0;

        }
        public int obtenerResultado()
        {
            return resultadoEjecucion;
        }
        public int cantidadDeAciertos
        {
            get;
            set;
        }
        public bool golpeoEnTurnoActual
        {
            get;
            set;
        }
        private bool falloArriba
        {
            set;
            get;
        }
        private bool falloAbajo
        {
            set;
            get;
        }
        private bool falloIzquierda
        {
            set;
            get;
        }
        private bool falloDerecha
        {
            set;
            get;
        }
        private bool golpeoEnTurnoAnterior
        {
            get;
            set;
        }
        public int modificarObtenerPosicionXExtremoA
        {
            get;
            set;
        }
        public int modificarObtenerPosicionYExtremoA
        {
            get;
            set;
        }
        public int modificarObtenerPosicionXExtremoB
        {
            get;
            set;
        }
        public int modificarObtenerPosicionYExtremoB
        {
            get;
            set;
        }
        public int ObtenerPosicionXDisparo
        {
            get;
            set;
        }
        public int ObtenerPosicionYDisparo
        {
            get;
            set;
        }
        private void verificarDisparo( int posicionX, int posicionY, int[,] tableroVistoPorCpu )
        {
            if (resultadoEjecucion == 3)
            {
                this.golpeoEnTurnoActual = true;
                this.golpeoEnTurnoAnterior = true;
                tableroVistoPorCpu[posicionY, posicionX] = resultadoEjecucion;
                this.modificarObtenerPosicionXExtremoB = posicionX;
                this.modificarObtenerPosicionYExtremoB = posicionY;
                this.ObtenerPosicionXDisparo = posicionX;
                this.ObtenerPosicionYDisparo = posicionY;
                this.cantidadDeAciertos += 1;
            }
            else
            {
                this.golpeoEnTurnoAnterior = true;
                this.golpeoEnTurnoActual = false;
                this.ObtenerPosicionXDisparo = posicionX;
                this.ObtenerPosicionYDisparo = posicionY;
                tableroVistoPorCpu[posicionY, posicionX] = resultadoEjecucion;
            }
        }
        public int cantidadRegresiones
        {
            set;
            get;
        }
        private void realizarModificaciones( int cambio)
        {
            if (resultadoEjecucion != 3)
            {
                if (cambio == 1)
                {
                    this.falloAbajo = true;
                }
                else if (cambio == 2)
                {
                    this.falloArriba = true;
                }
                else if (cambio == 3)
                {
                    this.falloDerecha = true;
                }
                else
                {
                    this.falloIzquierda = true;
                }
            }
            else
            {
                if (cambio == 1)
                {
                    this.falloAbajo = false;
                }
                else if (cambio == 2)
                {
                    this.falloArriba = false;
                }
                else if (cambio == 3)
                {
                    this.falloDerecha = false;
                }
                else
                {
                    this.falloIzquierda = false;
                } 
            }
        }
        public bool ProcesarJugada(Tablero TableroJugador, int[,] TableroVistoCpu, JugadorCpu cpu)
        {
            bool seLogroUbicar = realizarMovimiento( TableroJugador, TableroVistoCpu);
            int x1 = modificarObtenerPosicionXExtremoA;
            int y1 = modificarObtenerPosicionYExtremoA;
            int x2 = modificarObtenerPosicionXExtremoB;
            int y2 = modificarObtenerPosicionYExtremoB;
            if (seLogroUbicar)
            {
                if (this.cantidadDeAciertos != techo)
                {
                    if (x1 == x2 && y1 == y2)
                    {
                        if (this.falloAbajo == true && this.falloArriba == true && this.falloDerecha == true && this.falloIzquierda == true)
                        {
                            return false;
                        }
                        else
                        {
                            return true;
                        }
                    }
                    else
                    {
                        if (x1 == x2)
                        {
                            if (this.falloAbajo == true && this.falloArriba == true)
                            {
                                if (cantidadRegresiones == 0)
                                {
                                    modificarObtenerPosicionXExtremoB = modificarObtenerPosicionXExtremoA;
                                    modificarObtenerPosicionYExtremoB = modificarObtenerPosicionYExtremoA;
                                    return true;
                                }
                                else
                                {
                                    return false;
                                }
                            }
                            else
                            {
                                return true;
                            }
                        }
                        else
                        {
                            if (this.falloDerecha == true && this.falloIzquierda == true)
                            {
                                if (cantidadRegresiones == 0)
                                {
                                    modificarObtenerPosicionXExtremoB = modificarObtenerPosicionXExtremoA;
                                    modificarObtenerPosicionYExtremoB = modificarObtenerPosicionYExtremoA;
                                    return true;
                                }
                                else
                                {
                                    return false;
                                }
                            }
                            else
                            {
                                return true;
                            }
                        }
                    }
                }
                else
                {
                    techo--;
                    return false;
                }
            }
            else
            {
                if (x1 == x2 && y1 == y2)
                {
                    cpu.cambiarResultadoTurno = false;
                    resultadoEjecucion=cpu.RealizarJugada(TableroJugador);
                    if (resultadoEjecucion == 3)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    modificarObtenerPosicionXExtremoB = modificarObtenerPosicionXExtremoA;
                    modificarObtenerPosicionYExtremoB = modificarObtenerPosicionYExtremoA;
                    return  ProcesarJugada( TableroJugador, TableroVistoCpu,cpu);
                }
            }
        }
        private bool realizarMovimiento(Tablero TableroJugador, int[,] TableroVistoCpu)
        {
            int x1=modificarObtenerPosicionXExtremoA;
            int y1=modificarObtenerPosicionYExtremoA;
            int x2=modificarObtenerPosicionXExtremoB;
            int y2=modificarObtenerPosicionYExtremoB;
            bool realizoMovimiento = false;
            resultadoEjecucion = 0;
            if (x1 == x2)
            {
                if (y2 + 1 < TAMANOMAXIMO)
                {
                    if (TableroVistoCpu[y2 + 1, x2] == 0)
                    {
                        if (realizoMovimiento == false)
                        {
                            resultadoEjecucion = TableroJugador.shoot(x2, y2 + 1);                     
                            verificarDisparo(x2, y2 + 1, TableroVistoCpu);
                            this.realizarModificaciones( 1);
                            realizoMovimiento = true;
                        }
                        else
                        {
                            this.falloAbajo = false;
                        }
                    }
                    else
                    {
                        this.falloAbajo = true ;
                    }
                }
                else
                {
                    this.falloAbajo = true;
                }
                if (y2 - 1 > 0)
                {
                    if (TableroVistoCpu[y2 - 1, x2] == 0)
                    {
                        if (realizoMovimiento == false)
                        {
                            resultadoEjecucion = TableroJugador.shoot(x2, y2 - 1);
                            verificarDisparo(x2, y2 - 1, TableroVistoCpu);
                            this.realizarModificaciones(2);
                            realizoMovimiento = true;
                        }
                        else
                        {
                            this.falloArriba = false;
                        }
                    }
                    else
                    {
                        this.falloArriba = true;
                    }
                }
                else
                {
                    this.falloArriba = true;
                }
            }
            if (y1 == y2)
            {
                if (x2 + 1 < TAMANOMAXIMO)
                {
                    if (TableroVistoCpu[y2, x2 + 1] == 0 )
                    {
                        if (realizoMovimiento == false)
                        {
                            resultadoEjecucion = TableroJugador.shoot(x2 + 1, y2);
                            verificarDisparo(x2 + 1, y2, TableroVistoCpu);
                            this.realizarModificaciones(3);
                            realizoMovimiento = true;
                        }
                        else
                        {
                            this.falloDerecha = false;
                        }
                    }
                    else
                    {
                        this.falloDerecha = true;
                    }
                }
                else 
                {
                    this.falloDerecha = true;
                }
                if (x2 - 1 > 0)
                {
                    if (TableroVistoCpu[y2, x2 - 1] == 0)
                    {
                        if (realizoMovimiento == false)
                        {
                            resultadoEjecucion = TableroJugador.shoot(x2 - 1, y2);
                            verificarDisparo(x2 - 1, y2, TableroVistoCpu);
                            this.realizarModificaciones(4);
                            realizoMovimiento = true;
                        }
                        else
                        {
                            this.falloIzquierda = false;
                        }
                    }
                    else
                    {
                        this.falloIzquierda = true;
                    }
                }
                else
                {
                    this.falloIzquierda = true;
                }
            }
            return realizoMovimiento;
        }
    }
}
